#pragma once

#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// 实现守护进程

void Daemon()
{
    // 忽略导致进程退出的信号
    signal(SIGCHLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);

    // 让进程不是进程组组长
    if (fork() > 0)
    {
        exit(0); // 父进程退出，子进程成为孤儿进程
    }

    // 更改守护进程工作路径: 设置为工作目录,就可以直接在根目录下找
    chdir("/");

    // 成为新会话
    setsid();

    // 处理标准输入输出以及错误
    // a、关闭对应文件描述符 b、重定向到""/dev/null"文件中, 它相当于是Linux系统中的一个垃圾桶文件
    int fd = open("/dev/null", O_RDWR);
    if (fd >= 0)
    {
        // 重定向
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
    }
}